package net.blank.ui
{
	import flash.text.engine.ContentElement;
	import flash.text.engine.ElementFormat;
	import flash.text.engine.FontDescription;
	import flash.text.engine.FontLookup;
	import flash.text.engine.FontPosture;
	import flash.text.engine.FontWeight;
	import flash.text.engine.TextElement;
	import flash.text.engine.TextJustifier;
	import flash.text.engine.TextLine;
	
	import net.blank.ui.core.Arrange;
	import net.blank.ui.core.Direction;
	import net.blank.ui.core.TextCreator;
	import net.blank.ui.core.UIEvent;

	/**
	 * 带文本标题的按钮,使用时注意以下事项
	 * <li>mouseChildren 属性已不被支持</li>
	 * @author blank
	 * 
	 */
	public class TextButton extends Button
	{
		/**
		 * 文本
		 */
		protected var _text:*;
		
		/**
		 * 左边距
		 */
		protected var _paddingLeft:Number;
		
		/**
		 * 右边距
		 */
		protected var _paddingTop:Number;
		
		/**
		 * 上边距
		 */
		protected var _paddingRight:Number;
		
		/**
		 * 下边距
		 */
		protected var _paddingBottom:Number;
		
		/**
		 * 行对齐方式
		 */
		protected var _lineJustifier:TextJustifier;
		
		/**
		 * 行间距(像素)
		 */
		protected var _lineGap:Number;
		
		/**
		 * 文本行的方向
		 */
		protected var _lineDirection:String;
		
		/**
		 * 字体名
		 */
		protected var _fontName:String;
		
		/**
		 * 字号
		 */
		protected var _fontSize:Number;
		
		/**
		 * 字体颜色
		 */
		protected var _color:uint;
		
		/**
		 * 透明度
		 */
		protected var _textAlpha:Number;
		
		/**
		 * 是否粗体
		 */
		protected var _isBold:Boolean;
		
		/**
		 * 是否斜体
		 */
		protected var _isItalic:Boolean;
		
		/**
		 * 字符右间距
		 */
		protected var _trackingRight:Number;
		
		/**
		 * 字符左间距
		 */
		protected var _trackingLeft:Number;
		
		/**
		 * 是否使用嵌入字体
		 */
		protected var _isEmbedded:Boolean;
		
		/**
		 * 文本元素格式
		 */
		protected var _elementFormat:ElementFormat;
		
		/**
		 * 文本行
		 */
		protected var _textLines:Vector.<TextLine>=new Vector.<TextLine>();
		
		/**
		 * 需要更新文本
		 */
		private var isNeedUpdateText:Boolean;
		
		/**
		 * 重置格式
		 * 
		 */
		protected function resetFormat():void{
			_fontName="_seri";
			_fontSize=12;
			_color=0x000000;
			_textAlpha=1;
			_isBold=false;
			_isItalic=false;
			_isEmbedded=false;
			
			_elementFormat=null;
		}
		
		/**
		 * 更新文本行
		 * 
		 */
		protected function updateTextLines():void{
			if(!_text){
				return;
			}
			
			var content:Vector.<ContentElement>;
			if(_text is String){
				if(!_elementFormat){
					_elementFormat=new ElementFormat(
						new FontDescription(
							_fontName || "_seri",
							_isBold ? FontWeight.BOLD : FontWeight.NORMAL,
							_isItalic ? FontPosture.ITALIC : FontPosture.NORMAL,
							_isEmbedded ? FontLookup.EMBEDDED_CFF : FontLookup.DEVICE
						),
						_fontSize,
						_color,
						_textAlpha,
						"auto","roman","useDominantBaseline",0,"on",
						_trackingRight,_trackingLeft
					);
				}
				content=Vector.<ContentElement>([new TextElement(_text,_elementFormat)]);
			}else if(_text is ContentElement){
				content=Vector.<ContentElement>([_text]);
			}else{
				content=_text as Vector.<ContentElement>;
			}
			
			switch(_lineDirection){
				default:
				case Direction.HORIZONTAL:
					TextCreator.createTextLines_h_fixedGap(
						content,
						_textLines,
						this,
						_paddingLeft,
						_paddingTop,
						_width-_paddingLeft-_paddingRight,
						_height-_paddingTop-_paddingBottom,
						Arrange.CENTER,
						Arrange.MIDDLE,
						_lineGap,
						_lineJustifier
					);
					break;
				case Direction.VERTICAL:
					TextCreator.createTextLines_v_fixedGap(
						content,
						_textLines,
						this,
						_paddingLeft,
						_paddingTop,
						_width-_paddingLeft-_paddingRight,
						_height-_paddingTop-_paddingBottom,
						Arrange.MIDDLE,
						Arrange.CENTER,
						_lineGap,
						_lineJustifier
					);
					break;
			}
		}
		
		override protected function update():void{
			super.update();
			
			if(isNeedUpdateText){
				updateTextLines();
				
				isNeedUpdateText=false;
			}
		}
		
		/**
		 * 更新文本
		 * 
		 */
		public function updateText():void{
			isNeedUpdateText=true;
			
			invalidate();
		}
		
		/**
		 * 大小发生改变,更新文本显示
		 * @param evt
		 * 
		 */
		protected function resizeHandler(evt:UIEvent):void{
			updateText();
		}
		
		/**
		 * 标签
		 * 
		 */
		public function TextButton(){
			mouseChildren=false;
			
			addEventListener(UIEvent.RESIZE,resizeHandler);
			
			super();
		}
		
		/**
		 * 文本,值可以为以下类型:<br/>
		 * <li>String 纯文本内容</li>
		 * <li>ContentElement 自带格式的文本内容,自带的格式不影响标签的 fontName, color等属性</li>
		 * <li>Vector.&lt;ContentElement&gt; 自带格式的文本内容,其中每一个 ContentElement 为一个段落</li>
		 * @param value
		 * 
		 */
		public function set text(value:*):void{
			if(value != _text){
				_text=value;
				
				updateText();
			}
		}
		public function get text():*{
			return _text;
		}
		
		/**
		 * 左边距(文本到左边框的像素距离)
		 * @param value
		 * 
		 */
		public function set paddingLeft(value:Number):void{
			if(value != _paddingLeft){
				_paddingLeft=value;
				
				updateText();
			}
		}
		public function get paddingLeft():Number{
			return _paddingLeft;
		}
		
		/**
		 * 上边距(文本到上边框的像素距离)
		 * @param value
		 * 
		 */
		public function set paddingTop(value:Number):void{
			if(value != _paddingTop){
				_paddingTop=value;
				
				updateText();
			}
		}
		public function get paddingTop():Number{
			return _paddingTop;
		}
		
		/**
		 * 右边距(文本到右边框的像素距离)
		 * @param value
		 * 
		 */
		public function set paddingRight(value:Number):void{
			if(value != _paddingRight){
				_paddingRight=value;
				
				updateText();
			}
		}
		public function get paddingRight():Number{
			return _paddingRight;
		}
		
		/**
		 * 下边距(文本到下边框的像素距离)
		 * @param value
		 * 
		 */
		public function set paddingBottom(value:Number):void{
			if(value != _paddingBottom){
				_paddingBottom=value;
				
				updateText();
			}
		}
		public function get paddingBottom():Number{
			return _paddingBottom;
		}
		
		/**
		 * 文本格式
		 * @param value
		 * 
		 */
		public function set elementFormat(value:ElementFormat):void{
			if(value){
				if(value.fontDescription){
					var fd:FontDescription=value.fontDescription;
					
					_fontName=fd.fontName;
					_isBold=fd.fontWeight == FontWeight.BOLD ? true : false;
					_isItalic=fd.fontPosture == FontPosture.ITALIC ? true : false;
					_isEmbedded=fd.fontLookup == FontLookup.EMBEDDED_CFF ? true : false;
				}
				
				_fontSize=value.fontSize;
				_color=value.color;
				_trackingRight=value.trackingRight;
				_trackingLeft=value.trackingLeft;
				_textAlpha=value.alpha;
				
				_elementFormat=null;
			}else{
				resetFormat();
			}
			updateText();
		}
		public function get elementFormat():ElementFormat{
			return _elementFormat;
		}
		
		/**
		 * 行对齐方式
		 * @param value
		 * 
		 */
		public function set lineJustifier(value:TextJustifier):void{
			if(value != _lineJustifier){
				_lineJustifier=value;
				
				updateText();
			}
		}
		public function get lineJustifier():TextJustifier{
			return _lineJustifier;
		}
		
		/**
		 * 文本行的方向
		 * @param value
		 * 
		 */
		public function set lineDirection(value:String):void{
			if(value != _lineDirection){
				_lineDirection=value;
				
				updateText();
			}
		}
		public function get lineDirection():String{
			return _lineDirection;
		}
		
		/**
		 * 字体名
		 */
		public function set fontName(value:String):void{
			if(value != _fontName){
				_fontName=value;
				
				_elementFormat=null;
			}
		}
		public function get fontName():String{
			return _fontName;
		}
		
		/**
		 * 字号
		 */
		public function set fontSize(value:Number):void{
			if(value != _fontSize){
				_fontSize=value;
				
				_elementFormat=null;
			}
		}
		public function get fontSize():Number{
			return _fontSize;
		}
		
		/**
		 * 字体颜色
		 */
		public function set color(value:uint):void{
			if(value != _color){
				_color=value;
				
				_elementFormat=null;
			}
		}
		public function get color():uint{
			return _color;
		}
		
		/**
		 * 透明度
		 */
		public function set textAlpha(value:Number):void{
			if(value != _textAlpha){
				_textAlpha=value;
				
				_elementFormat=null;
			}
		}
		public function get textAlpha():Number{
			return _textAlpha;
		}
		
		/**
		 * 是否粗体
		 */
		public function set isBold(value:Boolean):void{
			if(value != _isBold){
				_isBold=value;
				
				_elementFormat=null;
			}
		}
		public function get isBold():Boolean{
			return _isBold;
		}
		
		/**
		 * 是否斜体
		 */
		public function set isItalic(value:Boolean):void{
			if(value != _isItalic){
				_isItalic=value;
				
				_elementFormat=null;
			}
		}
		public function get isItalic():Boolean{
			return _isItalic;
		}
		
		/**
		 * 字符右间距
		 */
		public function set trackingRight(value:Number):void{
			if(value != _trackingRight){
				_trackingRight=value;
				
				_elementFormat=null;
			}
		}
		public function get trackingRight():Number{
			return _trackingRight;
		}
		
		/**
		 * 字符左间距
		 */
		public function set trackingLeft(value:Number):void{
			if(value != _trackingLeft){
				_trackingLeft=value;
				
				_elementFormat=null;
			}
		}
		public function get trackingLeft():Number{
			return _trackingLeft;
		}
		
		/**
		 * 是否使用嵌入字体
		 */
		public function set isEmbedded(value:Boolean):void{
			if(value != _isEmbedded){
				_isEmbedded=value;
				
				_elementFormat=null;
			}
		}
		public function get isEmbedded():Boolean{
			return _isEmbedded;
		}
		
		override public function reset():void{
			super.reset();
			
			_paddingLeft=2;
			_paddingTop=2;
			_paddingRight=2;
			_paddingBottom=2;
			
			_lineJustifier=null;
			
			_lineGap=4;
			
			resetFormat();
			
			_text=null;
			TextCreator.releaseTextLines(_textLines,this);
		}
		
		override public function destroy():void{
			super.destroy();
			
			TextCreator.releaseTextLines(_textLines,this);
			
			_elementFormat=null;
			_lineJustifier=null;
			_text=null;
		}
		
		override public function set mouseChildren(enable:Boolean):void{};
	}
}